home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Auge 4000 / Auge 4000 #73 (1993-11-10)(Amiga User Gruppe Einzugsgebiet 4000).zip / Auge 4000 #73 (1993-11-10)(Amiga User Gruppe Einzugsgebiet 4000).adf / WaitFor / WaitFor.c < prev    next >
C/C++ Source or Header  |  1993-05-10  |  6KB  |  287 lines

  1. /*                          Programm -WaitFor-                              */
  2. /*                                                                          */
  3. /*                Dieses Programm ermöglicht das Warten auf                 */
  4. /*                                                                          */
  5. /*   - Das Erscheinen eines Fensters    (Option <WINDOW>)                   */
  6. /*   - Das Erscheinen eines Screens     (Option <SCREEN>)                   */
  7. /*   - Das Erscheinen eines Tasks       (Option <TASK>)                     */
  8. /*   - Das Verschwinden eines Fensters  (Option <ENDWINDOW>)                */
  9. /*   - Das Verschwinden eines Screens   (Option <ENDSCREEN>)                */
  10. /*   - Das Verschwinden eines Tasks     (Option <ENDTASK>)                  */
  11. /*   - Das Drücken einer Maustaste      (Option <LMB, MMB, RMB>)            */
  12. /*                                                                          */
  13. /*                                                                          */
  14. /*    Compilieren : CC NewPrefs.c -md -so                                   */
  15. /*    Linken      : LN NewPrefs.o -lcl  (AztecC V5.2)                       */
  16. /*                                                                            */
  17.  
  18. /* Include Files */
  19.  
  20. #include <Intuition/IntuitionBase.h>
  21. #include <Exec/ExecBase.h>
  22. #include <Exec/Tasks.h>
  23. #include <Libraries/DosExtens.h>
  24. #include <Libraries/DOS.h>
  25. #include <Hardware/CIA.h>
  26.  
  27.  
  28. /* Globale Variablen */
  29.  
  30. struct IntuitionBase        *IntuitionBase ;
  31. struct Screen                *screen ;
  32. extern struct ExecBase        *SysBase ;
  33. extern struct CIA            ciaa ;
  34. extern struct Custom        custom ;
  35.  
  36.  
  37. int main(int argc, char *argv[])
  38. {
  39.     if (!(IntuitionBase = (struct IntuitionBase *)    /* intuition.library */
  40.     OpenLibrary ("intuition.library", 0L)))            /* öffnen */
  41.         exitall (10) ;
  42.  
  43.     if (argc==2)
  44.     {
  45.  
  46.         if (!(stricmp(argv[1], "LMB")))
  47.         {
  48.             while (ciaa.ciapra&(1<<CIAB_GAMEPORT0))
  49.                 Delay (5) ;
  50.             exitall (0) ;
  51.         }
  52.         else
  53.         if (!(stricmp(argv[1], "RMB")))
  54.         {
  55.             while (custom.potinp&(1<<10))
  56.                 Delay (5) ;
  57.             exitall (0) ;
  58.         }
  59.         else
  60.         if (!(stricmp(argv[1], "MMB")))
  61.         {
  62.             while (custom.potinp&(1<<8))
  63.                 Delay (5) ;
  64.             exitall (0) ;
  65.         }
  66.     }
  67.     else
  68.     if (argc==3)
  69.     {
  70.         if (!(stricmp(argv[1], "TASK")))
  71.         {
  72.             FOREVER
  73.             {
  74.                 /* Task in TaskWait und TaskReady-Liste suchen */
  75.  
  76.                 Disable () ;
  77.                 if (findtask ((struct Task *) SysBase->TaskWait.lh_Head, argv[2]))
  78.                     break ;
  79.                 else
  80.                 if (findtask ((struct Task *) SysBase->TaskReady.lh_Head, argv[2]))
  81.                     break ;
  82.                 Enable () ;
  83.                 Delay (10) ;
  84.             }
  85.             Enable () ;
  86.             exitall (0) ;
  87.         }
  88.         else
  89.         if (!(stricmp(argv[1], "ENDTASK")))
  90.         {
  91.             /* Ist Task überhaupt vorhanden ? */
  92.  
  93.             FOREVER
  94.             {
  95.                 /* Task in TaskWait und TaskReady-Liste suchen */
  96.  
  97.                 Disable () ;
  98.                 if (findtask ((struct Task *) SysBase->TaskWait.lh_Head, argv[2]))
  99.                     break ;
  100.                 else
  101.                 if (findtask ((struct Task *) SysBase->TaskReady.lh_Head, argv[2]))
  102.                     break ;
  103.                 Enable () ;
  104.                 exitall (5) ;
  105.             }
  106.  
  107.             /* Wenn ja, auf Ende des Tasks warten */
  108.  
  109.             FOREVER
  110.             {
  111.                 /* Task in TaskWait und TaskReady-Liste suchen */
  112.  
  113.                 Disable () ;
  114.                 if (!(findtask ((struct Task *) SysBase->TaskWait.lh_Head, argv[2])))
  115.                     if (!(findtask ((struct Task *) SysBase->TaskReady.lh_Head, argv[2])))
  116.                         break ;
  117.                 Enable () ;
  118.                 Delay (10) ;
  119.             }
  120.             Enable () ;
  121.             exitall (0) ;
  122.         }
  123.         else
  124.         if (!(stricmp(argv[1], "SCREEN")))
  125.         {
  126.             /* Screen suchen */
  127.  
  128.             FOREVER
  129.             {
  130.                 Forbid () ;
  131.                 if (findscreen (IntuitionBase->FirstScreen, argv[2]))
  132.                     break ;
  133.                 Permit () ;
  134.                 Delay (10) ;
  135.             }
  136.             Permit () ;
  137.             exitall (0) ;
  138.         }
  139.         else
  140.         if (!(stricmp(argv[1], "ENDSCREEN")))
  141.         {
  142.             /* ist Screen überhaupt vorhanden ? */
  143.  
  144.             Forbid () ;
  145.             if (!(findscreen (IntuitionBase->FirstScreen, argv[2])))
  146.             {
  147.                 Permit () ;
  148.                 exitall (5) ;
  149.             }
  150.  
  151.             /* Wen ja, Auf Schließen des Screens warten */
  152.             FOREVER
  153.             {
  154.                 Forbid () ;
  155.                 if (!(findscreen (IntuitionBase->FirstScreen, argv[2])))
  156.                     break ;
  157.                 Permit () ;
  158.                 Delay (10) ;
  159.             }
  160.             Permit () ;
  161.             exitall (0) ;
  162.         }
  163.         else
  164.         if (!(stricmp(argv[1], "WINDOW")))
  165.         {
  166.             /* Window in allen Screens suchen */
  167.  
  168.             FOREVER
  169.             {
  170.                 Forbid () ;
  171.                 screen = IntuitionBase->FirstScreen ;
  172.                 while (screen)
  173.                 {
  174.                     if (findwindow (screen, argv[2]))
  175.                     {
  176.                         Permit () ;
  177.                         exitall (0) ;
  178.                     }
  179.                     screen = screen->NextScreen ;
  180.                 }
  181.                 Permit () ;
  182.                 Delay (10) ;
  183.             }
  184.         }
  185.         else
  186.         if (!(stricmp(argv[1], "ENDWINDOW")))
  187.         {
  188.             /* Ist Window in irgendeinem Screens überhaupt vorhanden ? */
  189.  
  190.             Forbid () ;
  191.             screen = IntuitionBase->FirstScreen ;
  192.             FOREVER
  193.             {
  194.                 if (findwindow (screen, argv[2]))
  195.                     break ;
  196.                 if (!(screen = screen->NextScreen))
  197.                 {
  198.                     Permit () ;
  199.                     exitall (5) ;
  200.                 }
  201.             }
  202.  
  203.             /* Wenn ja, auf Schließen des Windows im entspr. Screen warten */
  204.  
  205.             while (findwindow (screen, argv[2]))
  206.             {
  207.                 Permit () ;
  208.                 Delay (10) ;
  209.                 Forbid () ;
  210.             }
  211.             exitall (0) ;
  212.         }
  213.     }
  214.     puts ("USAGE : WaitFor <LMB|MMB|RMB|SCREEN|ENDSCREEN|") ;
  215.     puts ("                 WINDOW|ENDWINDOW|TASK|ENDTASK> <Name>") ;
  216.     exitall (5) ;
  217. }
  218.  
  219. findtask (struct Task *task, char *name)
  220. {
  221.     struct Process                *proc ;
  222.     struct CommandLineInterface    *cli ;
  223.     char                         *str ;
  224.  
  225.     while (task->tc_Node.ln_Succ)
  226.     {
  227.         /* printf ("Task : %s\n", task->tc_Node.ln_Name) ; */
  228.         if (stricmp(name, task->tc_Node.ln_Name) == 0)
  229.             return (TRUE) ;
  230.  
  231.         /* Falls CLI-Process, den Programmnamen aus CLI-Struktur holen */
  232.  
  233.         if (task->tc_Node.ln_Type == NT_PROCESS)
  234.         {
  235.             proc = (struct Process *) task ;
  236.             if (proc->pr_TaskNum != 0)
  237.             {
  238.                 /* dieser dämliche BCPL-Mist im Amiga-System ;-( */
  239.  
  240.                 cli = (struct CommandLineInterface *) BADDR(proc->pr_CLI) ;
  241.                 str = (char *) BADDR(cli->cli_CommandName) ;
  242.                 /* printf ("Proc : %s\n", str+1) ; */
  243.                 if (*str)
  244.                 {
  245.                     if (strnicmp(name, str+1, *str) == 0)
  246.                         return (TRUE) ;
  247.                 }
  248.             }
  249.         }
  250.         task = (struct Task *) task->tc_Node.ln_Succ ;
  251.     }
  252.     return (FALSE) ;
  253. }
  254.  
  255. findscreen (struct Screen *scr, char *name)
  256. {
  257.     while (scr)
  258.     {
  259.         if (stricmp(name, scr->Title) == 0)
  260.             return (TRUE) ;
  261.         scr = scr->NextScreen ;
  262.     }
  263.     return (FALSE) ;
  264. }
  265.  
  266. findwindow (struct Screen *scr, char *name)
  267. {
  268.     struct Window *win ;
  269.  
  270.     win = scr->FirstWindow ;
  271.     while (win)
  272.     {
  273.         if (stricmp(name, win->Title) == 0)
  274.             return (TRUE) ;
  275.         win = win->NextWindow ;
  276.     }
  277.     return (FALSE) ;
  278. }
  279.  
  280.  
  281. exitall (int err)
  282. {
  283.     if (IntuitionBase)
  284.         CloseLibrary (IntuitionBase) ;
  285.     exit (err) ;
  286. }
  287.